/**
 * 类型管理
 * 
 * @author XiongChun
 * @since 2010-02-13
 */
Ext.onReady(function() {
	var root = new Ext.tree.AsyncTreeNode({
		//在js中定义的变量他的值是request作用域中的值，属性名是rootMenuname
		text : root_menuname,
		expanded : true,
		id : '0101'
	});
	//动态加载树，当数下的菜单还是目录时继续加载，一直记在到叶子，有点类适与递归调用！
var menuTree = new Ext.tree.TreePanel({
		loader : new Ext.tree.TreeLoader({
					baseAttrs : {},
					dataUrl : './fjglDemo.ered?reqCode=queryMenuItems'
				}),
		root : root,
		title : '',
		//树形菜单将要渲染的层！
		applyTo : 'menuTreeDiv',
		autoScroll : false,
		animate : false,
		useArrows : false,
		border : false
	});
//每次菜单被点击就会触发事件，用于加载这个类型下的当前项目的附件信息！
	menuTree.on('click', function(node) 
			{
				moder='save';
				//菜单的编号和菜单名字！
				menuid = node.attributes.id;
				menuname = node.attributes.text;
				Ext.getCmp('add').enable();
				//这一步代码非常关键，当时叶子时才允许添加，否则不允许！
				if(node.leaf)
				{
					Ext.getCmp('add').enable();
					//其实就是录入和修改界面中的父菜单的名字，这个控件中的值是不可以手动修改的，仅仅对用户来说是只读的！
					//Ext.getCmp('parentmenuname').setValue(menuname);
					//同时设置父菜单的编号，因为保存和修改时是通过编号来操作的，名字只是给用户看的!
					//Ext.getCmp('parentid').setValue(menuid);
					store.load({
								params : 
								{
									start : 0,
									limit : bbar.pageSize,
									//每次点击菜单都会讲当前被点击的菜单的编号传递到后台！
									menuid : menuid
								}
							});
					//结束程序！
					return;
				}
				//如果仅仅用单纯的if else对是不能把点击加号排除了，因此必须这样价格else if,即既不是叶子也不是节点
				else if(!node.leaf)
				{
					Ext.getCmp('add').disable();
					//其实就是录入和修改界面中的父菜单的名字，这个控件中的值是不可以手动修改的，仅仅对用户来说是只读的！
					//Ext.getCmp('parentmenuname').setValue(menuname);
					//同时设置父菜单的编号，因为保存和修改时是通过编号来操作的，名字只是给用户看的!
					//Ext.getCmp('parentid').setValue(menuid);
					store.load({
								params : 
								{
									start : 0,
									limit : bbar.pageSize,
									//每次点击菜单都会讲当前被点击的菜单的编号传递到后台！
									parentid : menuid
								}
							});
				}
				else
				{
					Ext.getCmp('add').disable();
					//其实就是录入和修改界面中的父菜单的名字，这个控件中的值是不可以手动修改的，仅仅对用户来说是只读的！
					//Ext.getCmp('parentmenuname').setValue(menuname);
					//同时设置父菜单的编号，因为保存和修改时是通过编号来操作的，名字只是给用户看的!
					//Ext.getCmp('parentid').setValue(menuid);
					store.load({
								params : 
								{
									start : 0,
									limit : bbar.pageSize,
									//每次点击菜单都会讲当前被点击的菜单的编号传递到后台！
									parentid : menuid
								}
							});
				}
			});
	menuTree.root.select();
	//定义一个方法调用标识！
	var moder='save';
	var sm = new Ext.grid.CheckboxSelectionModel();
	var cm = new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(), sm, 
	                                  {
										header : '下载',
										dataIndex : 'attc_path',
										width : 40,
										renderer : lianjieRender
	                                },{
	                       				header : '项目编号',
	                       				dataIndex : 'prj_sn',
	                       				hidden:true,
	                       				width : 200
	                       			},
	                       	         {
	                       				header : '附件编号',
	                       				dataIndex : 'attc_sn',
	                       				hidden:true,
	                       				width : 130
	                       			},
	                       			{
	                       				header : '附件类型',
	                       				dataIndex : 'tp_name',
	                       				width : 130
	                       			}, {
	                       				header : '文件名称',
	                       				dataIndex : 'filename',
	                       				width : 200
	                       			}, {
	                       				header : '上传时间',
	                       				dataIndex : 'attc_update',
	                       				sortable : true,
	                       				width : 130
	                       			}, {
	                       				header : '备注',
	                       				dataIndex : 'attc_mark'
	                       			}]);
	/**
	 * 数据存储
	 */
	var store = new Ext.data.Store({
		proxy : new Ext.data.HttpProxy({
					url : './fjglDemo.ered?reqCode=queryFj'
				}),
		reader : new Ext.data.JsonReader({
					totalProperty : 'TOTALCOUNT',
					root : 'ROOT'
				}, [   	   {
							name : 'attc_sn'
						}, {
							name : 'tp_name'
						}
						,{
							name : 'filename'
						},  {
							name : 'attc_update'
						}, {
							name : 'attc_mark'
						}])
	});


	// 翻页排序时带上查询条件，这里主要定义了每次查询必须要提交的条件参数！
	store.on('beforeload', function() {
				this.baseParams = 
				{
					//每次在重新加载数据时都会将查询条件带上！
					queryParam : Ext.getCmp('queryParam').getValue()
				};
			});

	var pagesize_combo = new Ext.form.ComboBox({
				name : 'pagesize',
				hiddenName : 'pagesize',
				typeAhead : true,
				triggerAction : 'all',
				lazyRender : true,
				mode : 'local',
				store : new Ext.data.ArrayStore({
							fields : ['value', 'text'],
							data : [[10, '10条/页'], [20, '20条/页'],
									[50, '50条/页'], [100, '100条/页'],
									[250, '250条/页'], [500, '500条/页']]
						}),
				valueField : 'value',
				displayField : 'text',
				value : '50',
				editable : false,
				width : 85
			});
	var number = parseInt(pagesize_combo.getValue());
	pagesize_combo.on("select", function(comboBox) {
				bbar.pageSize = parseInt(comboBox.getValue());
				number = parseInt(comboBox.getValue());
				store.reload({
							params : {
								start : 0,
								limit : bbar.pageSize
							}
						});
			});

	// 分页工具栏
	var bbar = new Ext.PagingToolbar({
				pageSize : number,
				store : store,
				displayInfo : true,
				displayMsg : '显示{0}条到{1}条,共{2}条',
				plugins : new Ext.ux.ProgressBarPager(), // 分页进度条
				emptyMsg : "没有符合条件的记录",
				items : ['-', '&nbsp;&nbsp;', pagesize_combo]
			});

	var grid = new Ext.grid.GridPanel({
				title : '<span style="font-weight:normal;color:red;">项目编号为：'+prj_no+'的附件信息表</span>',
				iconCls : 'application_view_listIcon',
				height : 500,
				// width:600,
				autoScroll : true,
				region : 'center',
				store : store,
				loadMask : {
					msg : '正在加载表格数据,请稍等...'
				},
				stripeRows : true,
				frame : true,
				cm : cm,
				sm : sm,
				viewConfig : {
					// 不产横向生滚动条, 各列自动扩展自动压缩, 适用于列数比较少的情况
								 forceFit : true
								},
				tbar : [{
							text : '新增附件',
							id:'add',
							iconCls : 'page_addIcon',
							disabled : true,
							handler : function() {
								moder='save';
								addInit();
							}
						}, '-', {
							text : '修改附件',
							disabled : true,
							iconCls : 'page_edit_1Icon',
							id:'update',
							handler : function() 
							{
								moder='update';
								editInit();
							}
						}, '-', {
							text : '删除附件',
							id:'delete',
							iconCls : 'page_delIcon',
							disabled : true,
							handler : function() 
							{
								deleteFJ();
							}
						}, '->', 
						//下面定义了一个控件，用于接收查询条件：文件名；  控件的id就是很多地方需要引用的queryParam
						new Ext.form.TextField({
									id : 'queryParam',
									name : 'queryParam',
									emptyText : '请输入文件名称',
									//允许控件触发键盘事件，其实就是方便可以提交，直接按回车也可以提交！
									enableKeyEvents : true,
									//键盘事件的回调方法！
									listeners : {
										specialkey : function(field, e) {
											if (e.getKey() == Ext.EventObject.ENTER) 
											{
												//如果触发的是回车就直接提交！
												queryMenuItem();
											}
										}
									},
									width : 130
								}), {
							text : '查询',
							iconCls : 'previewIcon',
							handler : function() {
								queryMenuItem();
								//由于查询后数据刷新没哟任何数据获得焦点，因此不允许删除和更新操作！
								Ext.getCmp('delete').disable();
								Ext.getCmp('update').disable();
							}
						}, '-', {
							text : '刷新',
							iconCls : 'arrow_refreshIcon',
							handler : function() {
								//刷新时也是没有焦点因此不允许操作！
								Ext.getCmp('delete').disable();
								Ext.getCmp('update').disable();
								store.reload();
							}
						}],
				bbar : bbar
			});
	//加载一次，其实就是初始化！
	store.load({
				params : {
					start : 0,
					limit : bbar.pageSize
				}
			});
	
	// 监听行选中事件
	grid.on('rowclick', function(pGrid, rowIndex, event) {
		//单击行事件将导致更新和删除按钮可用！
				Ext.getCmp('delete').enable();
				Ext.getCmp('update').enable();
			});
	//双击表格中的记录代表的就是要修改附件的信息！
	grid.on('rowdblclick', function(grid, rowIndex, event) {
				editInit();
				moder='update';
			});
	//用于处理下载的，当单元格被选中时自动下载指定的文件！
	grid.on("cellclick", function(pGrid, rowIndex, columnIndex, e) {
		var store = pGrid.getStore();
		var record = store.getAt(rowIndex);
		var fieldName = pGrid.getColumnModel().getDataIndex(columnIndex);
		// columnIndex为小画笔所在列的索引,缩阴从0开始
		if (fieldName == 'attc_path' && columnIndex == 2) 
		{
			var attc_sn = record.get("attc_sn");
			// 通过iFrame实现类ajax文件下载
			// 这个很重要
			var downloadIframe = document.createElement('iframe');
			downloadIframe.src = 'fjglDemo.ered?reqCode=downloadFile&attc_sn=' + attc_sn;
			downloadIframe.style.display = "none";
			document.body.appendChild(downloadIframe);
		}
	});
	
	
	
	addMenuFormPanel = new Ext.form.FormPanel({
		id : 'addMenuFormPanel',
		name : 'addMenuFormPanel',
		fileUpload : true, // 一定要设置这个属性,否则获取不到上传对象的
		defaultType : 'textfield',
		labelAlign : 'right',
		labelWidth : 65,
		frame : false,
		bodyStyle : 'padding:5 5 0',
		items : [ {
					fieldLabel : '附件类型名',
					id : 'fjtypeName',
					allowBlank : true,
					readOnly:true,
					anchor : '99%'
				},
				{
					fieldLabel : '附件编号',
					id : 'attc_tp',
					allowBlank : false,
					readOnly:true,
					anchor : '99%'
				}
				,
				{
					fieldLabel : '请选择附件',
					//设置为不可用，即只能看不能修改！
					//readOnly : true,
					allowBlank : false, // 是否允许为空
					id:'f1',
					name : 'file1',
					emptyText : '提示：文件上传后自动填充',
					xtype : 'fileuploadfield', // 上传字段
					anchor : '99%'
				}, {
					fieldLabel : '备注',
					name : 'attc_mark',
					allowBlank : true,
					anchor : '99%'
				}]
	});
addMenuWindow = new Ext.Window({
		layout : 'fit',
		width : 420,
		height : 285,
		resizable : false,
		draggable : true,
		closeAction : 'hide',
		title : '<span class="commoncss">新增附件</span>',
		// iconCls : 'page_addIcon',
		modal : true,
		collapsible : true,
		titleCollapse : true,
		maximizable : false,
		buttonAlign : 'right',
		border : false,
		animCollapse : true,
		pageY : 20,
		pageX : document.body.clientWidth / 2 - 420 / 2,
		animateTarget : Ext.getBody(),
		constrain : true,
		items : [addMenuFormPanel],
		buttons : [{
			text : '保存',
			iconCls : 'acceptIcon',
			handler : function() {
				if (runMode == '0') 
				{
					Ext.Msg.alert('提示',
							'系统正处于演示模式下运行,您的操作被取消!该模式下只能进行查询操作!');
					return;
				}
				//用于一个变量来标识到底调用哪个方法可以使代码复用！
				if(moder=='save')
				{
					checkFileExist();
				}
				else if(moder=='update')
				{
					update();
				}
			}
		}, {
			text : '重置',
			id : 'btnReset',
			iconCls : 'tbar_synchronizeIcon',
			handler : function() {
				clearForm(addMenuFormPanel.getForm());
			}
		}, {
			text : '关闭',
			iconCls : 'deleteIcon',
			handler : function() {
				addMenuWindow.hide();
			}
		}]
	});
	/**
	 * 布局
	 */
	var viewport = new Ext.Viewport({
				layout : 'border',
				items : [{
							title : '<span class="commoncss">请选择附件类型</span>',
							iconCls : 'layout_contentIcon',
							tools : [{
										id : 'refresh',
										handler : function() {
											menuTree.root.reload();
										}
									}],
							collapsible : true,
							width : 210,
							minSize : 160,
							maxSize : 280,
							split : true,
							region : 'west',
							autoScroll : true,
							items : [menuTree]
						}, {
							region : 'center',
							layout : 'fit',
							border : false,
							items : [grid]
						}]
			});
	/**
	 * 保存菜单数据
	 */
	function saveMenuItem(biaozhi) {
		addMenuFormPanel.form.submit({
					url : './fjglDemo.ered?reqCode=saveFj',
					waitTitle : '提示',
					method : 'POST',
					waitMsg : '正在处理数据,请稍候...',
					success : 
						function(form, action) 
						{
						//隐藏添加窗口！
						addMenuWindow.hide();
						//重新加载数据！
						store.reload();
						form.reset();
						Ext.MessageBox.alert('提示', action.result.msg);
						Ext.Msg.confirm('请确认', '新增成功,您要继续新增项目附件吗?', function(
								btn, text) {
							if (btn == 'yes') {
								addMenuFormPanel.getForm().reset();
								addMenuWindow.show();
							} 
							else 
							{
								addMenuFormPanel.getForm().reset();
								addMenuWindow.hide();
								store.reload();
							}
						}); 
					},
					failure : 
						function(form, action) 
					{
						var msg = action.result.msg;
						Ext.MessageBox.alert('提示', '菜单数据保存失败:<br>' + msg);
					},
					params : {
						biaozhi : biaozhi
					}
				});
	}
	//检查要上传的文件是否存在，以至于决定是否需要覆盖文件！
	function checkFileExist()
	{
		if (!addMenuFormPanel.form.isValid()) 
		{
			return;
		}
		if (runMode == '0') {
			Ext.Msg.alert('提示', '系统正处于演示模式下运行,您的操作被取消!该模式下只能进行查询操作!');
			return;
		}
		var path=Ext.getCmp('f1').value;
		Ext.Ajax.request({
			url : 'fjglDemo.ered?reqCode=fileIsExist',
			success : function(response) 
			{
				var resultArray = Ext.util.JSON.decode(response.responseText);
				if(resultArray.msg=='exist')
				{
					Ext.Msg.confirm('请确认', '当前要上传的文件已经存在，您是否需要覆盖呢,如果是就覆盖，否则就创建一个新的?', function(
							btn, text) {
						if (btn == 'yes') 
						{
							saveMenuItem('true');
						} 
						else 
						{
							saveMenuItem('false');
						}
					}); 
				}
				//不存在就不覆盖
				else
				{
					//如果文件不存在直接保存不再询问了！
					saveMenuItem('false');
				}
			},
			failure : function(response) {
				Ext.Msg.alert('提示', "tianjia附件失败");
			},
			params : {
				path : path
			}
		});
	}

	/**
	 * 刷新指定节点
	 */
	function refreshNode(nodeid) {
		var node = menuTree.getNodeById(nodeid);
		/* 异步加载树在没有展开节点之前是获取不到对应节点对象的 */
		if (Ext.isEmpty(node)) {
			menuTree.root.reload();
			return;
		}
		if (node.attributes.leaf) {
			node.parentNode.reload();
		} else {
			node.reload();
		}
	}

	/**
	 * 根据条件查询菜单
	 */
	function queryMenuItem() {
		var selectModel = menuTree.getSelectionModel();
		var selectNode = selectModel.getSelectedNode();
		if (Ext.isEmpty(selectNode)) 
		{
			Ext.Msg.alert('提示', '当前没有选中任何节点!');
			return;
		} 
		if(selectNode.leaf)
		{
				store.load({
					params : {
						start : 0,
						limit : bbar.pageSize,
						queryParam : Ext.getCmp('queryParam').getValue(),
						menuid : selectNode.id
					}
				});
		}
		else
		{
			store.load({
				params : {
					start : 0,
					limit : bbar.pageSize,
					queryParam : Ext.getCmp('queryParam').getValue(),
					parentid : selectNode.id
				}
			});
		}
	}

	/**
	 * 删除菜单
	 */
	function deleteFJ() {
		if (runMode == '0') {
			Ext.Msg.alert('提示', '系统正处于演示模式下运行,您的操作被取消!该模式下只能进行查询操作!');
			return;
		}
		var rows = grid.getSelectionModel().getSelections();
		if (Ext.isEmpty(rows)) {
			Ext.Msg.alert('提示', '请先选中要删除的文件!');
			return;
		}
		//将要删除的附件编号字符串传递过去！
		var strChecked = jsArray2JsString(rows, 'attc_sn');
		Ext.Msg.confirm('请确认', '你真的要删除所有选中的文件吗?', function(btn, text) {
			if (btn == 'yes') {
				showWaitMsg();
				Ext.Ajax.request({
					url : 'fjglDemo.ered?reqCode=deleteFj',
					success : function(response) {
						var resultArray = Ext.util.JSON
								.decode(response.responseText);
						Ext.Msg.alert('提示', resultArray.msg);
						store.reload();
					},
					failure : function(response) {
						Ext.Msg.alert('提示', "删除附件失败");
					},
					params : {
						strChecked : strChecked
					}
				});
			}
		});
	}

	
	/**
	 * 修改菜单初始化
	 */
	function editInit() {
		var record = grid.getSelectionModel().getSelected();
		//得到多条被选中的记录
		var rows = grid.getSelectionModel().getSelections();
		//查看是否记录得到焦点，如果没有被选中，那么就停止程序！
		if (Ext.isEmpty(record)) 
		{
			Ext.Msg.alert('提示:', '请先选中项目');
			return;
		}
		//当选中多条时不允许同时上传！
		if(rows.length>1)
		{
			Ext.Msg.alert('提示：','不能同时修改多条记录');
			return;
		}
		Ext.getCmp('fjtypeName').setValue(record.data.tp_name);
		Ext.getCmp('attc_tp').setValue(record.data.attc_sn);
		addMenuWindow.show();
		addMenuWindow.setTitle('<span style="font-weight:normal">修改项目编号为：'+prj_no+'菜单</span>');
		
	}

	/**
	 * 新增菜单初始化
	 */
	function addInit() {
		var selectModel = menuTree.getSelectionModel();
		var selectNode = selectModel.getSelectedNode();
		Ext.getCmp('fjtypeName').setValue(selectNode.attributes.text);
		Ext.getCmp('attc_tp').setValue(selectNode.attributes.id);
		addMenuWindow.show();
		addMenuWindow.setTitle('<span style="font-weight:normal">新增项目编号为：'+prj_no+'的附件</span>');
	}


	// 对连接的一个渲染
	function lianjieRender(value) {
		return "<a href='javascript:void(0);'><img src='" + webContext
		+ "/resource/image/ext/download.png'/></a>";
		;
	}

	
	
	/**
	 * 更新
	 */
	function update() {
		if (!addMenuFormPanel.form.isValid()) 
		{
			return;
		}
		if (runMode == '0') {
			Ext.Msg.alert('提示', '系统正处于演示模式下运行,您的操作被取消!该模式下只能进行查询操作!');
			return;
		}
		var record = grid.getSelectionModel().getSelected();
		addMenuFormPanel.form.submit({
					url : './fjglDemo.ered?reqCode=updatePath',
					waitTitle : '提示',
					method : 'POST',
					waitMsg : '正在处理数据,请稍候...',
					success : function(form, action) {
						store.reload();
						Ext.MessageBox.alert('提示', action.result.msg);
						addMenuWindow.hide();
						addMenuFormPanel.getForm().reset();
					},
					failure : function(form, action) {
						var msg = action.result.msg;
						Ext.MessageBox.alert('提示', '数据修改失败:<br>' + msg);
						addMenuFormPanel.getForm().reset();
					},
					params : {
						attc_sn : record.data.attc_sn
					}
				});
	}
	
	
});